<?php
class SaldoAlmacene extends AppModel {

	var $name = 'SaldoAlmacene';

	var $belongsTo = array(
		'Producto' => array(
			'className' => 'Producto',
			'foreignKey' => 'producto_id'
		),
        'Almacene'=>array(
			'className' => 'Almacene',
			'foreignKey' => 'almacen_id'
		),
	);

        /**
         * verifica el Stock
         * @param array $stock (almacen,producto,movimiento=0)
         */
	/*
	function stockProducto($stock = array()){
		$this->recursive = -1;
		$lookPeriodo = $this->find('first',array(
                    'order' => array('SaldoAlmacene.id DESC'),
                    'fields'=>('SaldoAlmacene.saldo_contable,SaldoAlmacene.producto_id,SaldoAlmacene.id'),
                    'conditions'=>array(
                        'SaldoAlmacene.almacen_id'=>$stock['almacen_id'],
                        'SaldoAlmacene.producto_id'=>$stock['producto_id']
						)
                ));
		$saldoContab 	= $lookPeriodo['SaldoAlmacene']['saldo_contable'] + $stock['movimiento'];
		if($idproducto !=0){
			return $saldoContab;
		} else {
			return '0';
		}
	}
	*/
	function getStockProducto($almacen, $producto){
            if(!$almacen || !$producto) return false;
            $result = $this->find('first', array(
                'recursive'=>-1,
                'order'=>array('SaldoAlmacene.id DESC'),
                'fields'=>array('saldo_fisico', 'producto_id', 'id'),
                'conditions'=>array(
                    'almacen_id'=>$almacen,
                    'producto_id'=>$producto
                )
            ));
            return $result['SaldoAlmacene']['saldo_fisico'];
	}

	/*
	 * $ingreso : Verificamos si es agregar salida es != 0, y ingreso =0
	 * si es parar ingreso = 1, y salida !=1
	 * @package array $moved (lote, almacen_id, producto_id, cantidad, valor, tipo_movimiento_id{1,2})
	 * @return int
	 * si @return === null --> no se guardaron datos
	 */
	function moverSaldos($Moved = array()){	
		$defaults = array(                    
                    'almacen_id'=>0,
                    'producto_id'=>0,
                    'cantidad'=>0,                    
                    'tipo_movimiento_id'=>1,
                );
		//modificacion para anular los lotes de produccion y no genere inconsistencia al despachar					
		$Moved = array_merge($defaults, $Moved);
				
		$data = $this->find('first',array(
                    'recursive'=>-1,
                    'order' => array('SaldoAlmacene.id DESC'),
                    'conditions'=>array(
                        'SaldoAlmacene.almacen_id'  =>$Moved['almacen_id'],
                        'SaldoAlmacene.ejercicio_id'=>$Moved['ejercicio_id'],
                        'SaldoAlmacene.periodo_id'  =>$Moved['periodo_id'],
                        'SaldoAlmacene.producto_id' =>$Moved['producto_id']                        
                    )
		));
		if (!isset($data['SaldoAlmacene']['id']) ||
                        empty($data['SaldoAlmacene']['id'])){
                    $data = $this->find('first',array(
                        'recursive'=>-1,
                        'order' => array('SaldoAlmacene.ejercicio_id DESC','SaldoAlmacene.periodo_id DESC'),
                        'conditions'=>array(
                            'SaldoAlmacene.almacen_id'=>$Moved['almacen_id'],
                            'SaldoAlmacene.producto_id'=>$Moved['producto_id']                            
                        )
                    ));
			
                    if (!isset($data['SaldoAlmacene']['id']) ||
                            empty($data['SaldoAlmacene']['id'])){
                        $data = array(
                            'SaldoAlmacene'=>array(
                                'ejercicio_id'=>0,
                                'periodo_id'=>0,
                                'almacen_id'=>0,
                                'producto_id'=>0,                                
                                'ingreso_fisico'=>0,                                
                                'salida_fisica'=>0,                               
                                'saldo_inicial'=>0,
                                'saldo_fisico'=>0,
                                
                            )
                        );
                    } else {
                        unset($data['SaldoAlmacene']['id']);
                    }
		}

		$lastPeriodo = $data['SaldoAlmacene']['periodo_id'];
		$lastEjercicio = $data['SaldoAlmacene']['ejercicio_id'];
		
		if ($Moved['tipo_movimiento_id']==1){ // ingreso
			//$nuevosaldo = $data['SaldoAlmacene']['saldo_fisico'] + $Moved['cantidad'];
			$nuevosaldo = $data['SaldoAlmacene']['saldo_fisico'] + $Moved['cantidad'];			
		} else { // salida
			$nuevosaldo = $data['SaldoAlmacene']['saldo_fisico'] - $Moved['cantidad'];
			/*
			// control del aprovisionamiento
			$puntoPedido = $this->getPuntoPedido($data['SaldoAlmacene']['producto_id']);
			if ($puntoPedido != false){
				if ($nuevosaldo < $puntoPedido['PuntoPedido']['min']){
			    // notificar el consumo del stock de seguridad
			  	} else if ($nuevosaldo < $puntoPedido['PuntoPedido']['estimado']){
			    // notificar el punto de pedido
				}
			}
			*/
		}
		
		$data['SaldoAlmacene']['almacen_id']    = $Moved['almacen_id'];
		$data['SaldoAlmacene']['ejercicio_id'] 	= $Moved['ejercicio_id'];
		$data['SaldoAlmacene']['periodo_id']   	= $Moved['periodo_id'];// cambiamos el periodo
		$data['SaldoAlmacene']['producto_id']	= $Moved['producto_id'];
				
		if(($Moved['periodo_id']!=$lastPeriodo) || ($Moved['ejercicio_id']!=$lastEjercicio)){
			if ($Moved['tipo_movimiento_id'] == 1){ // ingreso
				$ingreso = $Moved['cantidad'];			
				$salida = 0;				
			} else{
				$salida = $Moved['cantidad'];				
				$ingreso = 0;				
			}
			
			$data['SaldoAlmacene']['ingreso_fisico']	= $ingreso;			
			$data['SaldoAlmacene']['salida_fisica']		= $salida;			
			$data['SaldoAlmacene']['saldo_inicial']		= $data['SaldoAlmacene']['saldo_fisico'];
			$data['SaldoAlmacene']['saldo_fisico']		= $nuevosaldo;			
			
			$this->create();
		} else {
			if ($Moved['tipo_movimiento_id'] == 1){ // ingreso
                $data['SaldoAlmacene']['ingreso_fisico']	+= $Moved['cantidad'];                            
			} else {
	            $data['SaldoAlmacene']['salida_fisica']	+= $Moved['cantidad'];                           
			}

			$data['SaldoAlmacene']['saldo_fisico']		= $nuevosaldo;
		}
		
		//redondeando valores calculados
		$data['SaldoAlmacene']['ingreso_fisico'] = round($data['SaldoAlmacene']['ingreso_fisico'], 4);		
		$data['SaldoAlmacene']['salida_fisica'] = round($data['SaldoAlmacene']['salida_fisica'], 4);
		$data['SaldoAlmacene']['saldo_inicial'] = round($data['SaldoAlmacene']['saldo_inicial'], 4);
		$data['SaldoAlmacene']['saldo_fisico'] = round($data['SaldoAlmacene']['saldo_fisico'], 4);		
		
		$res = null;
		if ($this->save($data)){
			$res = $nuevosaldo;
		}		
		return $res;
	}

	function getPuntoPedido($id){
		$pedido = $this->Producto->PuntoPedido->find('first',array(
			'fields'=>array('estimado'),
			'conditions'=>array('producto_id'=>$id),
			'order'=>array('fecha'=>'desc'),
			'recursive'=>-1
		));
		if (!array_key_exists('PuntoPedido', (array)$pedido) || empty($pedido['PuntoPedido']['id']))
			return false;
		else
			return $pedido;
	}	
}
?>